import { defineStore } from 'pinia'
import { useTaskStore } from './03.state(选项式)'

/**
 * Pinia Store示例 - 04.getters(选项式)
 * 
 * 这个文件展示了如何在选项式API中定义和使用getters
 */

// 产品Store
export const useProductStore = defineStore('products', {
  state: () => ({
    // 产品列表
    products: [
      { id: 1, name: '手机', price: 3999, category: '电子产品', stock: 10 },
      { id: 2, name: '笔记本电脑', price: 8999, category: '电子产品', stock: 5 },
      { id: 3, name: '耳机', price: 999, category: '电子产品', stock: 15 },
      { id: 4, name: '书籍', price: 59, category: '图书', stock: 20 },
      { id: 5, name: '背包', price: 199, category: '服饰', stock: 8 }
    ],
    // 当前选择的分类
    selectedCategory: null,
    // 价格过滤范围
    priceRange: {
      min: 0,
      max: 10000
    }
  }),

  getters: {
    /**
     * 获取所有可用的分类
     * 这是一个基本的getter，只依赖state
     */
    categories(state) {
      // 从产品中提取所有不重复的分类
      return [...new Set(state.products.map(product => product.category))]
    },

    /**
     * 获取过滤后的产品列表
     * 这个getter依赖state中的多个属性
     */
    filteredProducts(state) {
      return state.products.filter(product => {
        // 根据分类过滤
        const categoryMatch = !state.selectedCategory || 
          product.category === state.selectedCategory
        
        // 根据价格范围过滤
        const priceMatch = product.price >= state.priceRange.min && 
          product.price <= state.priceRange.max
        
        return categoryMatch && priceMatch
      })
    },

    /**
     * 获取过滤后的产品数量
     * 这个getter依赖另一个getter
     */
    filteredProductCount() {
      // 这里的this指向store实例，可以访问其他getter
      return this.filteredProducts.length
    },

    /**
     * 获取过滤后产品的总价值
     * 这个getter也依赖另一个getter
     */
    totalValue() {
      return this.filteredProducts.reduce((sum, product) => {
        return sum + product.price * product.stock
      }, 0)
    },

    /**
     * 获取产品的平均价格
     * 这个getter依赖state和其他getter
     */
    averagePrice() {
      const products = this.filteredProducts
      if (products.length === 0) return 0
      
      const total = products.reduce((sum, product) => sum + product.price, 0)
      return Math.round(total / products.length)
    },

    /**
     * 获取库存不足的产品
     * 这个getter使用了参数
     */
    lowStockProducts: (state) => (threshold) => {
      return state.products.filter(product => product.stock < threshold)
    },

    /**
     * 获取指定ID的产品
     * 这个getter也使用了参数
     */
    getProductById: (state) => (productId) => {
      return state.products.find(product => product.id === productId)
    },

    /**
     * 获取产品价格区间
     * 这个getter计算产品的最低和最高价格
     */
    priceStats(state) {
      if (state.products.length === 0) {
        return { min: 0, max: 0 }
      }
      
      const prices = state.products.map(product => product.price)
      return {
        min: Math.min(...prices),
        max: Math.max(...prices)
      }
    },

    /**
     * 获取任务统计信息
     * 这个getter访问另一个store
     */
    taskStats() {
      const taskStore = useTaskStore()
      
      // 计算完成和未完成任务的数量
      const completedTasks = taskStore.tasks.filter(task => task.completed).length
      const totalTasks = taskStore.tasks.length
      
      return {
        total: totalTasks,
        completed: completedTasks,
        active: totalTasks - completedTasks,
        progress: totalTasks ? Math.round((completedTasks / totalTasks) * 100) : 0
      }
    }
  },

  actions: {
    /**
     * 设置选中的分类
     */
    setCategory(category) {
      this.selectedCategory = category
    },

    /**
     * 重置分类过滤
     */
    resetCategoryFilter() {
      this.selectedCategory = null
    },

    /**
     * 设置价格范围
     */
    setPriceRange(min, max) {
      this.priceRange.min = min
      this.priceRange.max = max
    },

    /**
     * 添加新产品
     */
    addProduct(product) {
      const newId = Math.max(0, ...this.products.map(p => p.id)) + 1
      this.products.push({
        id: newId,
        ...product
      })
    },

    /**
     * 更新产品库存
     */
    updateStock(productId, newStock) {
      const product = this.products.find(p => p.id === productId)
      if (product) {
        product.stock = newStock
      }
    }
  }
})
